try catch 是控制錯誤很重要的機制
有個新手常發生的問題必須出新手村前要通過試煉
請指出下面程式碼不良的寫法
(怕有人沒看清楚我故意加上一堆這是錯誤示範)
//這是錯誤示範
static void Main(string[] args)
{
try
{
廚房();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Console.ReadKey();
}
//這是錯誤示範
static void 廚房()
{
try
{
廁所();
}
catch (Exception ex)
{
throw ex;
}
}
//這是錯誤示範
static void 廁所()
{
throw new Exception("發現小強!!");
}
//這是錯誤示範
先來看看Log到怎樣的資訊
System.Exception: 發現小強!!
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\code\Yame.Tools\TestConsole\Program.cs: 行 26
有發現問題嗎 並沒有紀錄到錯誤的方法是 廁所()
反而變成 廚房()
這樣寫就是再改變 案發現場 誤導工程師去錯誤的場所打小強
千萬不可以寫 throw ex; 這樣就是把案發現場改到廚房
請這樣寫
static void 廚房()
{
try
{
廁所();
}
catch (Exception ex)
{
throw;
}
}
System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26
這樣就可以正確記錄了
視情況也有一種作法 就是放到InnerException
static void 廚房()
{
try
{
廁所();
}
catch (Exception ex)
{
throw new Exception("看到小強但找不到",ex);
}
}
System.Exception: 看到小強但找不到 ---> System.Exception: 發現小強!!
於 TestConsole.Program.廁所() 於 G:\TestConsole\Program.cs: 行 47
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 38
--- 內部例外狀況堆疊追蹤的結尾 ---
於 TestConsole.Program.廚房() 於 G:\TestConsole\Program.cs: 行 42
於 TestConsole.Program.Main(String[] args) 於 G:\TestConsole\Program.cs: 行 26
很完整的例外好文
Exception 怎麼丟才丟得好
Exception 怎麼丟才丟得準
Exception 怎麼接才接得漂亮
Huan-Lin 老師的文章
C# 例外處理(Exception Handling)
例外處理可是很深奧的,這次試煉是基本功請打好基礎